package com.hice.demo.java.concurrent.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 测试Lock的使用。在方法中使用Lock，可以避免使用Synchronized关键字。
 *
 * @author hyson
 * @create 2017-03-13 14:03
 */
public class LockTest {

    Lock lock = new ReentrantLock();// 锁
    double value = 0d; // 值
    int addtimes = 0;

    /**
     * 增加value的值，该方法的操作分为2步，而且相互依赖，必须实现在一个事务中
     * 所以该方法必须同步，以前的做法是在方法声明中使用Synchronized关键字。
     */
    public void addValue(double v) {
        lock.lock();// 取得锁
        System.out.println("LockTest to addValue: " + v + "   "
                + System.currentTimeMillis());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        try {
            // 做写的工作
            this.value += v;
            this.addtimes++;
        } finally {
            // 释放锁
            lock.unlock();
        }
    }

    public double getValue() {
        return this.value;
    }
}
